package com.hfb.mashibing.alip8.designpattern._01singleton;


/**
 * DCL Doubble Check Loading
 * loay loding
 * 懒汉式
 * 虽然达到了按需初始化的目的，单却带来了不安全的问题
 * 可以通过synchronized解决，但也带来效率下降
 *
 * 关键字new 是非原子性的，
 * 在jvm中执行了3个指令，故 在3个指令中介都可以被中断
 * Integer a = new Integer(8)
 * |__生申请内存 ，并设置为默认值，如；Integer i = 0
 * |__赋值初始值，如；Integer i = 8
 * |__指针赋值--指向实例，把 i 的地址赋值给 a
 */
public class Mgr06 {
    // volatile:
    // 线程间可见
    // 禁止指令重排
    private static volatile Mgr06 INSTANCE; //JIT

    private Mgr06() {}

    public static Mgr06 getInstance() {
        // do something。。。
        if (null == INSTANCE) {
            // 双重检查
            synchronized (Mgr06.class) {
                if (null == INSTANCE) {
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    INSTANCE = new  Mgr06();
                }
            }
        }
        return INSTANCE;
    }
    public void m() {System.out.println("m");}


    public static void main(String[] args) {
//        for (int i = 0; i < 100; i++) {
//            new Thread(()->{
//                System.out.println(Mgr05.getInstance().hashCode());
//            }).start();
//        }
//

        // 验证 new 背后是4条指令
        Object o = new Object();
    }
}
